package cn.knet.sp.ncrm.modules.customer.importsupport;

import cn.knet.sp.ncrm.common.utils.StringUtils;
import cn.knet.sp.ncrm.modules.sys.utils.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @INFO: 添加导入用户工具类
 * @Author: shishouyang
 * @Time: 2015/8/27 17:50
 */
public class ImportUtil {

    /**
     * 表格转对象
     *
     * @param xssfSheet 表格
     * @param rule      　公有，私有
     * @param userId    　用户ID
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static List<ImportVO> readXlsx(XSSFSheet xssfSheet, String rule, String userId) {
        List<ImportVO> voList = new ArrayList<ImportVO>();
        // Read the Row
        for (int rowNum = 3; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
            XSSFRow xssfRow = xssfSheet.getRow(rowNum);
            // Read the Cell
            ImportVO vo = row2obj(xssfRow);
            vo.setVersion(Long.parseLong("0"));//版本
            vo.setSource("系统添加");
            vo.setDateCreated(new Date());//创建时间
            vo.setLastUpdated(new Date());//最后更新时间
            vo.setDistStatus("UNDISTED");//分配状态
            vo.setMergerNum(0);//合并数量
            vo.setMobileOrPc("pc");//设备来源
            vo.setNoReadMergerNum(0);//未读合并数量
            vo.setVisitNum(0);//回访次数
            vo.setRecordVisibilityRule(rule);//公有私有
            vo.setVisibilityUserId(userId);//持有人ID
            vo.setDelFlag("0");//删除标识
            if (StringUtils.isBlank(vo.getWeight() + "")) {
                vo.setWeight(0);//权重
            }
            //仅个人导入需要初始化执行人ID
            if("private".equalsIgnoreCase(rule)){
                vo.setExecutorId(userId);//执行人ID
            }

            voList.add(vo);
        }
        return voList;
    }

    /**
     * 行转对象
     *
     * @param xssfRow 表格行
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    private static ImportVO row2obj(XSSFRow xssfRow) {
        ImportVO vo = new ImportVO();

        //必填项
        vo.setCorporationName(getValue(xssfRow.getCell(0)));//公司名称
        vo.setContactorName(getValue(xssfRow.getCell(1)));//联系人
        vo.setMobile(getValue(xssfRow.getCell(2)));//手机
        vo.setTelephone(getValue(xssfRow.getCell(3)));//电话
        vo.setWeight(Integer.parseInt(getValue(xssfRow.getCell(4))));//权重

        //选填项
        vo.setCorporationUrl(getValue(xssfRow.getCell(5)));//公司域名
        vo.setEmail(getValue(xssfRow.getCell(6)));//邮箱
        vo.setBackupTelephone(getValue(xssfRow.getCell(7)));//备用电话
        vo.setProvinceId(RegionUtils.getRegionId(getValue(xssfRow.getCell(8))));//省市
        vo.setContactorPosition(getValue(xssfRow.getCell(9)));//职务
        vo.setContactorSex(DictUtils.getDictValue(getValue(xssfRow.getCell(10)), "sex", "1"));//性别
        vo.setContactorQq(getValue(xssfRow.getCell(11)));//QQ
        vo.setContactorWechat(getValue(xssfRow.getCell(12)));//微信
        vo.setIndustry(getValue(xssfRow.getCell(13)));//行业
        vo.setSource(getValue(xssfRow.getCell(14)));//一级来源
        vo.setSourceDesc(getValue(xssfRow.getCell(15)));//二级来源
        vo.setCustomerFeatureId(CustomerUtils.getFeatureId(getValue(xssfRow.getCell(16))));//客户特点
        vo.setCustomerTypeId(CustomerUtils.getTypeId(getValue(xssfRow.getCell(17))));//客户类型
        vo.setTargetProducts(ProductUtils.get(getValue(xssfRow.getCell(18))));//产品意向

        //选填项(补充信息)
        vo.setCorporationScale(getValue(xssfRow.getCell(19)));// 公司规模
        if (StringUtils.isNotBlank(getValue(xssfRow.getCell(20)))) {
            vo.setCorporationCreateDate(new Date(xssfRow.getCell(20).getDateCellValue().getTime()));// 公司成立时间
        }
        vo.setCorporationCorporateName(getValue(xssfRow.getCell(21)));// 公司法人名称
        vo.setCorporationCorporateSex(DictUtils.getDictValue(getValue(xssfRow.getCell(22)), "sex", "1"));// 公司法人性别
        vo.setCorporationFax(getValue(xssfRow.getCell(23)));// 公司传真
        vo.setCorporationIntroduction(getValue(xssfRow.getCell(24)));// 公司介绍
        vo.setCorporationBusinessModel(getValue(xssfRow.getCell(25)));// 公司经营模式
        vo.setCorporationRegisterFunds(getValue(xssfRow.getCell(26)));// 公司注册资金
        vo.setCorporationRegisterAddress(getValue(xssfRow.getCell(27)));// 公司注册地址
        vo.setCorporationStaffNum(getValue(xssfRow.getCell(28)));// 公司员工人数
        vo.setCorporationQualitySystem(getValue(xssfRow.getCell(29)));// 公司质量体系
        vo.setCorporationEnterpriseType(getValue(xssfRow.getCell(30)));// 公司企业类型

        return vo;
    }

    /**
     * 设置单元格样式
     *
     * @param workbook
     * @param cell
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static void setStyle(XSSFWorkbook workbook, XSSFCell cell) {
        CellStyle style = workbook.createCellStyle();
        style.setFillBackgroundColor(IndexedColors.RED.getIndex());
        style.setFillForegroundColor(IndexedColors.RED.getIndex());
        style.setFillPattern(CellStyle.FINE_DOTS);
        // 定义单元格为文本
        style.setDataFormat(workbook.createDataFormat().getFormat("@"));
        cell.setCellStyle(style);
    }

    /**
     * 设置行样式
     *
     * @param workbook
     * @param row
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static void setStyle(XSSFWorkbook workbook, XSSFRow row) {
        CellStyle style = workbook.createCellStyle();
        style.setFillBackgroundColor(IndexedColors.RED.getIndex());
        style.setFillForegroundColor(IndexedColors.RED.getIndex());
        style.setFillPattern(CellStyle.FINE_DOTS);
        // 定义单元格为文本
        style.setDataFormat(workbook.createDataFormat().getFormat("@"));
        row.setRowStyle(style);
    }

    /**
     * 重置单元格样式
     *
     * @param workbook
     * @param cell
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static void setCellDefaultStyle(XSSFWorkbook workbook, XSSFCell cell) {
        CellStyle style = workbook.createCellStyle();
        // 定义单元格为文本
        style.setDataFormat(workbook.createDataFormat().getFormat("@"));
        if(null!=cell){
            cell.setCellStyle(style);
        }
    }


    /**
     * 重置行样式
     *
     * @param workbook
     * @param row
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static void setRowDefaultStyle(XSSFWorkbook workbook, XSSFRow row) {
        if(null==row.getCell(0)){
            row.createCell(0);
        }
        if(null==row.getCell(1)){
            row.createCell(1);
        }
        if(null==row.getCell(2)){
            row.createCell(2);
        }
        if(null==row.getCell(3)){
            row.createCell(3);
        }
        if(null==row.getCell(4)){
            row.createCell(4);
        }
        setCellDefaultStyle(workbook,row.getCell(0));
        setCellDefaultStyle(workbook,row.getCell(1));
        setCellDefaultStyle(workbook,row.getCell(2));
        setCellDefaultStyle(workbook,row.getCell(3));
        setCellDefaultStyle(workbook,row.getCell(4));
    }

    /**
     * 验证必填项
     *
     * @param param the Cell Value of the excel file
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static boolean checkRequired(String param) {
        return StringUtils.isNotBlank(param);
    }

    /**
     * 验证Mobile
     *
     * @param param the Cell Value of the excel file
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static boolean checkMobile(String param) {
        return param.matches("^1\\d{10}$");
    }

    /**
     * 验证Phone
     *
     * @param param the Cell Value of the excel file
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static boolean checkPhone(String param) {
        return param.matches("^[\\d-]{1,20}$");
    }

    /**
     * 验证权重
     *
     * @param param the Cell Value of the excel file
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static boolean checkWeight(String param) {
        return param.matches("^\\d{1,3}$");
    }


    /**
     * Read XSSFCell Value
     *
     * @param xssfCell the XSSFCell of the excel file
     * @author shishouyang
     * @date 2015-08-24 11:29:12
     */
    public static String getValue(XSSFCell xssfCell) {
        if (null == xssfCell) {
            return "";
        } else if (xssfCell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(xssfCell.getBooleanCellValue());
        } else if (xssfCell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
            return String.valueOf(new DecimalFormat("#").format(xssfCell.getNumericCellValue()));
        } else {
            return String.valueOf(xssfCell.getStringCellValue());
        }
    }

}
